JS | הצפנה זהה לPHP
אני בונה עכשיו מערכת העלאת תמונות אבל בAJAX כלומר הJS מטפל בהצגה של השם של התמונה , גודל וכו'
אני רוצה להציג קישור לתמונה - הקטע הוא שהקישור צריך להיות יחודי כלומר או הצפנה או זמן (date) .
האם יש פונקצייה בPHP שמצפינה שיש אותה גם בJS ?
כדי שהקישור לתמונה יהיה זהה לפרטים במסד וכו .
חיפשתי באינטרנט ומצאתי כל מיני דברים אבל הם לא עבדו .. (md5 ' base64)
7 תשובות
או להשתמש בחותמת זמן (מספר השניות מאז 1970) או לקבל עם ajax את הקישור הייחודי.
אני לא ממש מבין את הקשו של ajax לנושא בחירת השם.
אתה נותן ללקוח לבחור את שם הקובץ? ומה אם הלקוח בוחר שם שכבר קיים בשרת? או מה עם הזמן של הלקוח שונה מהזמן של השרת ? בזמן העלאה השרת יקרא לקובץ בשם כלשהו וזהו.
בJS יש אפשרות לשים עוגיה נכון ? אז אני עושה עוגיה עם הזמן וככה הPHP מקבל את העוגיה ומכניס אותה למסד .
וזה יהיה השם של הקובץ .
האם יש הצפנה בJS (כלומר MD5 , BASE64 וזה לא ממש משנה) שזהה לPHP ?
זה בעיית אבטחה מאוד רצינית! אסור בשום פנים ואופן לסמוך על מידע שמגיע מהמשתמש (עוגיות זה מידע שאין לך שליטה עליו). המערכת שלך תהיה גם פגיעה ל-SQL Injection וגם למתקפות שקשורות למערכת הקבצים. איך עובד אלגוריתם העלאת הקבצים שלך?
- iosolidar
אין פונקצייה מובנת, אבל תמיד אפשר לכתוב אחת משלך על פי האלגוריתם או למצוא בגוגל.
יש פה גם חלק שאם אתה גורר את הקובץ מעל איזור מסויים זה מעלה אותו גם ....
זה הקוד JS שלי ...
var dir = "upload/";
var domain = "http://localhost/ajax/upload/" ;
// getElementById
function $id(id) {
return document.getElementById(id);
}
// output information
function Output(msg) {
var m = $id("messages");
m.innerHTML = msg + m.innerHTML;
}
// file drag hover
function FileDragHover(e) {
e.stopPropagation();
e.preventDefault();
e.target.className = (e.type == "dragover" ? "hover" : "");
}
// file selection
function FileSelectHandler(e) {
// cancel event and hover styling
FileDragHover(e);
// fetch FileList object
var files = e.target.files || e.dataTransfer.files;
// process all File objects
for (var i = 0, f; f = files[i]; i++) {
ParseFile(f);
UploadFile(f);
}
}
// output file information
//***************************HERE I NEED TO CREATE A NAME TO THE FILR TO SHOW IT TO THE USER************************************//
function ParseFile(file) {
var size = file.size /131072;
var mbsize = Math.floor(size*100)/100 ;
var link = domain + dir + file.name ;
Output(
"<p>File information: <strong>" + file.name +
"</strong> type: <strong>" + file.type +
"</strong> size: <strong>" + mbsize +
"</strong> MB</p><p>link: <a href='" + link +
"' alt=''><strong>" + link +
"</strong></a><br />"
);
// display an image
if (file.type.indexOf("image") == 0) {
var reader = new FileReader();
reader.onload = function(e) {
Output(
"<p><strong>" + file.name + ":</strong><br />" +
'<img src="' + e.target.result + '" /></p>'
);
}
reader.readAsDataURL(file);
}
// display text
if (file.type.indexOf("text") == 0) {
var reader = new FileReader();
reader.onload = function(e) {
Output(
"<p><strong>" + file.name + ":</strong></p><pre>" +
e.target.result.replace(/</g, "<").replace(/>/g, ">") +
"</pre>"
);
}
reader.readAsText(file);
}
}
// upload JPEG files
function UploadFile(file) {
// following line is not necessary: prevents running on SitePoint servers
if (location.host.indexOf("sitepointstatic") >= 0) return
var xhr = new XMLHttpRequest();
if (xhr.upload && file.size <= $id("MAX_FILE_SIZE").value) {
if (file.type == "image/jpg" || file.type == "image/jpeg" || file.type == "image/png" || file.type == "image/gif" ) {
// create progress bar
var o = $id("progress");
var progress = o.appendChild(document.createElement("p"));
progress.appendChild(document.createTextNode(dir + file.name));
// progress bar
xhr.upload.addEventListener("progress", function(e) {
var pc = parseInt(100 - (e.loaded / e.total * 100));
progress.style.backgroundPosition = pc + "% 0";
}, false);
// file received/failed
xhr.onreadystatechange = function(e) {
if (xhr.readyState == 4) {
progress.className = (xhr.status == 200 ? "success" : "failure");
}
};
// start upload
xhr.open("POST", $id("upload").action, true);
xhr.setRequestHeader("X_FILENAME", file.name);
xhr.send(file);
}
}
}
// initialize
function Init() {
var fileselect = $id("fileselect"),
filedrag = $id("filedrag"),
submitbutton = $id("submitbutton");
// file select
fileselect.addEventListener("change", FileSelectHandler, false);
// is XHR2 available?
var xhr = new XMLHttpRequest();
if (xhr.upload) {
// file drop
filedrag.addEventListener("dragover", FileDragHover, false);
filedrag.addEventListener("dragleave", FileDragHover, false);
filedrag.addEventListener("drop", FileSelectHandler, false);
filedrag.style.display = "block";
// remove submit button
submitbutton.style.display = "none";
}
}
// call initialization file
if (window.File && window.FileList && window.FileReader) {
Init();
}
})();
javascript זה לא חלופה לסקריפט בצד שרת. אתה עדיין צריך לעשות את כל הבדיקות הללו עם PHP. הלקוח יכול לשלוח לך האש/timestamp שכבר קיים במערכת ולעשות override לקובץ קיים וזה במקרה הטוב, במקרה הפחות טוב הוא יכול להעלות לך shell או לעשות override לקבצים רגישים. הסקריפט בצד השרת צריך לייצר את כל החלקים הרגישים כמו ID לקובץ. תקבל את הקובץ בשרת ושוב תעשה את אותם בדיקות ולאחר מכן תייצר את ההאש.
- iosolidar